Ordinary
About

라이브러리 vs 프레임워크

profileordilov / 2022. 2. 14

프레임워크와 라이브러리의 차이점에 대해서 종종 물어보곤 합니다. 그럴 때마다 개념적으로 어렴풋이는 알지만 정확한 대답을 하지 못했습니다. 그러다 배워가면서 추가된 내용을 정리하려합니다.

프레임워크

처음 프레임워크를 들었을 때 배운 것은 "틀", "뼈대" 입니다. 단어의 뜻만 알고 있어도 기반구조 같은 거구나 하고 인식할 수 있었습니다. 소프트웨어의 정의로는 다음과 같습니다.

소프트웨어의 특정 문제를 해결하기 위해서 상호 협력하는 클래스와 인터페이스의 집합

이후에 프레임워크를 직접 써보고 배우게 된 것은 제어의 역전(Inversion of Control)입니다. 일반적으로 코드를 작성하면 사람이 어떤 것을 먼저 호출하고 사용할지 결정합니다. 하지만 프레임워크의 경우 프로그램의 흐름을 프레임워크가 결정합니다. 프레임워크가 필요할 때 제 코드를 호출해 사용하는 방식입니다. 프레임워크의 대표적인 예로는 Spring, Django 등이 있습니다. 라이브러리는 "도서관" 이라는 뜻처럼 함수나 기능들을 모아놓은 것입니다. 도서관에서 책을 빌려서 읽을 수는 있지만, 빌린 책으로 무언가를 만들 수는 없습니다. 단순히 소비자로써 사용만 가능한 것을 라이브러리라고 합니다. 소프트웨어적으로는 사용가능한 클래스들의 집합이 됩니다. 라이브러리의 대표적인 예로는 JQuery가 있습니다.


여기까지는 다른 글들에서도 많이 봤을 것이라 생각됩니다. 사실 위의 내용을 충분히 숙지했다면 문제가 될 것은 없습니다. 문제는 저처럼 대충 알고 넘어갔을 때 혼동이 생기는 경우입니다. 제가 혼동이 오기 시작했던 건 Java Collections 때문입니다. Java Collections는 프레임워크일까요, 아니면 라이브러리일까요? 그리고 React는 프레임워크일까요, 아니면 라이브러리일까요?

첫 번째 정답은 프레임워크입니다.

Java Collections는 자주 사용하는 자료구조들에 대한 인터페이스와 구현체 클래스들을 갖고 있습니다. 위의 프레임워크의 소프트웨어 설명에 따르면 맞는 말입니다. 그럼에도 제게 낯설게 느껴졌던 것은 주 사용 목적 때문입니다.

주로 Collections를 사용할 때 라이브러리처럼 ArrayList, HashMap 같은 자료구조를 그냥 가져다 씁니다. 개인적으로 Collections의 자료 구조의 Interface를 구현해서 사용할 일은 없었습니다. 물론 이런 특성 때문에 Java Collections는 라이브러리의 방식으로 동작하는 프레임워크라고 불립니다. 따라서 무언가 틀 안에서 코드를 만들어야할 것 같은 프레임워크와 괴리감이 느껴졌습니다.

두 번째 정답은 라이브러리입니다.

이번에는 반대로 React로 UI 컴포넌트들을 만들어나간다는 느낌 때문에 프레임워크라고 생각했습니다. 하지만 공식 홈페이지에서도 명시되어있듯이 React는 라이브러리입니다. 단순히 프로그램을 만드는 틀이 프레임워크입니다, 흐름을 제어합니다로 구분할 수 있을까요? React로 만들다 보면 React에 명시된 규칙대로 프로그램을 작성하게 됩니다. 검색만 하면 사용하고 있는 것이 프레임워크인지 라이브러리인지는 구분할 수 있습니다. 하지만 쉬운 개념인 것 같은데도 구분이 안되는 데는 부족한 개념이 있다고 생각되었습니다. 헷갈리는 이유 중 하나에는 프레임워크는 라이브러리의 특성을 포함한다는 점입니다. 즉 프레임워크 = 라이브러리 + ? 로 설명할 수 있습니다. 그래서 프레임워크만 가지는 특성들을 찾아봤습니다.

확장성

프레임워크는 가지고 있는 기능을 확장 가능해야 합니다. 중요한 것은 기존의 프레임워크 코드를 수정하지 않아야 한다는 점입니다. 일반적으로 생각해볼 수 있는 방법은 세 가지가 있습니다.

1. 일반 클래스를 상속 받는다.

2. 인터페이스를 구현한다.

3. 추상 클래스를 상속 받는다.

Java Collections의 경우에는 1번과 2번이 가능했습니다. ArrayList, HashMap 같은 클래스를 상속받을 수 있습니다. 혹은 List, Map 같은 인터페이스를 직접 구현해서 사용할 수 있습니다. 3번의 경우에는 Java Collections에서는 사용되지 않습니다. Spring의 DB 연결이나 Servlet 구조가 이 형태로 되어 있습니다. 사용 방법은 디자인 패턴에 따라 달라지게 됩니다. 3번의 경우는 대부분의 작업은 동일하지만 특정 기능이 다르게 만드려고 할 때 주로 사용합니다. 디자인 패턴에서 템플릿 메서드 패턴를 떠올릴 수 있습니다.